<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>GUI</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="alternate" type="application/rss+xml" title="AutoHotkey Forum RSS" href="../../forum/rss.php">
<link href="../css/default.css" rel="stylesheet" type="text/css">
<style type="text/css">
<!--
h1 {font-size: 200%; margin-top: 0.5em}
-->
</style>
</head>
<body>

<h1>GUI</h1>

<p>创建和管理窗口和控件. 这种窗口可以用作数据输入窗体或自定义用户界面.</p>

<pre class="Syntax">Gui, sub-command [, Param2, Param3, Param4]</pre>
<h2>目录</h2>
<ul>
  <li><a href="#Add">Add</a>: 创建控件例如文本, 按钮或复选框.</li>
  <li><a href="#Show">Show</a>: 显示窗体. 同时可以最小化, 最大化或移动窗体.</li>
  <li><a href="#Submit">Submit</a>: 保存用户的输入并可以隐藏窗体.</li>
  <li><a href="#Cancel">Cancel</a> (或 Hide): 隐藏窗体.</li>
  <li><a href="#Destroy">Destroy</a>: 销毁窗体.</li>
  <li><a href="#Font">Font</a>: 为后续创建的控件文本设置文字的字体, 大小, 风格和颜色.</li>
  <li><a href="#Color">Color</a>: 设置窗体和/或其控件的背景颜色.</li>
  <li><a href="#Margin">Margin</a>: 设置在没有为控件指定明确的位置时使用的边距/间隔. </li>
  <li><a href="#Options">窗体的选项和风格</a>: 为窗体的外观和行为设置各种选项.</li>
  <li><a href="#Menu">Menu</a>: 添加或移除菜单.</li>
  <li><a href="#Minimize">Minimize / Maximize / Restore</a>: 对窗口执行指示的操作.</li>
  <li><a href="#Flash">Flash</a>: 闪烁窗口及其任务栏按钮.</li>
  <li><a href="#Default">Default</a>: 改变当前线程的默认 GUI 窗体编号. </li>
  <li><a href="#Position">控件的定位和大小设置</a></li>
  <li><a href="#Events">保存和响应用户的输入</a>: 变量和 g-label </li>
  <li><a href="#OtherOptions">控件的选项和样式</a></li>
  <li><a href="#Labels">窗体事件</a>: <a href="#GuiClose">GuiClose</a> | <a href="#GuiEscape">GuiEscape</a> | <a href="#GuiSize">GuiSize</a> | <a href="#GuiContextMenu">GuiContextMenu</a> | <a href="#GuiDropFiles">GuiDropFiles</a></li>
  <li><a href="#MultiWin">创建多个 GUI 窗体</a></li>
  <li><a href="#DefaultWin">GUI 事件, 线程和子过程</a></li>
  <li>其他操作: <a href="#Navigate">键盘导航 | </a><a href="#Appear">窗体外观</a> | <a href="#GenRemarks">一般说明</a></li>
  <li><a href="#Examples">示例</a>: 包含演示 GUI 窗体和控件的有效脚本</li>
</ul>

<h2 id="Add">Gui, Add, ControlType [, Options, Text]</h2>
<p>添加控件到 GUI 窗体 (必要时首先创建 GUI 窗体).</p>

<p><em>ControlType</em> 可以是下列的其中一个:</p>
<ul>
  <li><a href="GuiControls.htm#Text">Text</a>, <a href="GuiControls.htm#Edit">Edit</a>, <a href="GuiControls.htm#UpDown">UpDown</a>, <a href="GuiControls.htm#Picture">Picture</a></li>
  <li><a href="GuiControls.htm#Button">Button</a>, <a href="GuiControls.htm#Checkbox">Checkbox</a>, <a href="GuiControls.htm#Radio">Radio</a></li>
  <li><a href="GuiControls.htm#DropDownList">DropDownList</a>, <a href="GuiControls.htm#ComboBox">ComboBox</a></li>
  <li><a href="GuiControls.htm#ListBox">ListBox</a>, <a href="ListView.htm">ListView</a>, <a href="TreeView.htm">TreeView</a></li>
  <li><a href="GuiControls.htm#Hotkey">Hotkey</a>, <a href="GuiControls.htm#DateTime">DateTime</a>, <a href="GuiControls.htm#MonthCal">MonthCal</a></li>
  <li><a href="GuiControls.htm#Slider">Slider</a>, <a href="GuiControls.htm#Progress">Progress</a></li>
  <li><a href="GuiControls.htm#GroupBox">GroupBox</a>, <a href="GuiControls.htm#Tab">Tab</a>, <a href="GuiControls.htm#StatusBar">StatusBar</a>, <a href="GuiControls.htm#IE_Control">Internet Explorer Control</a></li>
</ul>
<p>例如:</p>
<pre>Gui, Add, Text,, Please enter your name:
Gui, Add, Edit, vName
Gui, Show</pre>
<h2 id="Show">Gui, Show [, Options, Title]</h2>
<p>如果没有在 <em>Options</em> 中明确指定, 此命令会让窗体以可见, 非最小化 (必要时), <a href="WinActivate.htm">激活</a> 并设置它的标题的状态显示. 如果省略了 <em>Title</em>, 则保留原来的标题 (如果没有, 则使用脚本的文件名称).</p>
<p>省略后面的 X, Y, W 和 H 选项则让窗体保持原来的大小和位置. 如果没有原来的位置, 则在后面提到的 X 和/或 Y 选项没有指明的坐标上窗体将自动居中. 如果没有原来的大小, 则窗体会根据它所包含控件的大小和位置自动调整大小.</p>
<p>在 <em>Options</em> 中可以包含零或多个下列字符串 (规定其中的每个数字为十进制, 而不是十六进制):</p>
<p> <strong>Wn</strong>: 指定 <strong>n</strong> 为窗体客户区 (客户区指除窗体边框, 标题栏和 <a href="#Menu">菜单栏</a> 的区域) 的宽度 (单位为像素).</p>
<p><strong>Hn</strong>: 指定 <strong>n</strong> 为窗体客户区的高度, 单位为像素.</p>
<p><strong>Xn</strong>: 指定 <strong>n</strong> 为窗体在屏幕中的 X 坐标, 单位为像素. 0 表示屏幕最左边首列可见像素的位置. </p>
<p><strong>Yn</strong>: 指定 <strong>n</strong> 为窗体在屏幕中的 Y 坐标, 单位为像素. 0 表示屏幕最上边首行可见像素的位置.</p>
<p><strong>Center</strong>: 让窗体在屏幕上水平和垂直方向居中.</p>
<p> <strong>xCenter</strong>: 让窗体在屏幕上水平方向居中. 例如: <em>Gui, Show, xCenter y0</em></p>
<p><strong>yCenter</strong>: 让窗体在屏幕上垂直方向居中.</p>
<p><strong><a name="AutoSize"></a>AutoSize</strong>: 根据窗体当前包含的可见控件调整窗体的大小. 这在添加一个新控件, 或重新设置现有控件的大小, 或隐藏/显示现有控件后调整窗体的大小很有用. 例如:<br>
  <em>Gui, Show, AutoSize Center</em></p>
<p><br>
  <em><strong>还可以包含下列参数的其中一个:</strong></em></p>
<p><strong>Minimize</strong>: 最小化当前窗体并激活下一个窗口.</p>
<p><strong>Maximize</strong>: 最大化并激活窗体.</p>
<p><strong>Restore</strong>: 当窗体最小化或最大化时, 还原窗体. 当窗体隐藏和不活动时, 显示并激活窗体.</p>
<p><strong>NoActivate</strong>: 当窗体最小化或最大化时, 还原窗体. 显示但不激活窗体.</p>
<p><strong>NA</strong>: 显示但不激活窗体. 如果窗体处于最小化状态, 它将仍保持这种状态但可能提升其 z-order (这是在 alt-tab 选择器中看到的顺序). 如果窗体之前是隐藏的, 此参数可能会让它显示在当前仍处于活动状态的窗口上面.</p>
<p><strong>Hide</strong>: 隐藏窗体并激活下一个窗口. 除了允许窗体被移动, 重设大小或在不显示的情况下设置新的标题外, 此参数与 <a href="#Cancel">Gui Cancel</a> 的效果相同. 例如: <em>Gui, Show, Hide x55 y66 w300 h200, New Title</em></p>

<h2 id="Submit">Gui, Submit [, NoHide]</h2>
<p>保存每个控件的内容到其 <a href="#var">关联变量</a> 中 (如果有的话) 并且在没有使用 NoHide 选项时隐藏窗体. 对于那些产生多个字段输出的控件, 例如 <a href="GuiControls.htm#ListBoxMulti">多选列表框</a>, 输出结果会使用窗体的 <a href="#Delimiter">当前分隔符</a> 来分隔多个字段的内容. 如果由于之前使用 <a href="#Destroy">Gui Destroy</a> 销毁了窗体或其他原因使得窗体不存在, 此命令没有效果.</p>

<h2 id="Cancel">Gui, Cancel</h2>
<p>隐藏当前窗体, 并不保存控件的内容到其 <a href="#var">关联变量</a> 中. 如果由于之前使用 <a href="#Destroy">Gui Destroy</a> 销毁了窗体或其他原因使得窗体不存在, 此命令没有效果.</p>

<h2 id="Destroy">Gui, Destroy</h2>
<p>移除当前窗体 (如果它存在的话) 及其所有控件, 并释放其占用的内存和系统资源. 如果脚本之后再创建窗体, 那么窗体的所有属性例如颜色和字体初始都为默认值 (如同窗体从没有出现过). 如果没有使用 <em>Gui Destroy</em>, 则当脚本退出时会自动销毁所有的 GUI 窗体.</p>

<h2 id="Font">Gui, Font [, Options, FontName]</h2>
<p>为在此处之后创建的控件设置字体字型, 大小, 样式和/或颜色. 例如:</p>
<pre>gui, font, s10, Verdana  <em>; Set 10-point Verdana.</em></pre>
<p>省略最后两个参数可以让字体恢复为系统默认的 GUI 字型, 大小和颜色.</p>
<p><em>FontName</em> 可以是任意字体的名称, 例如 <a href="../misc/FontsStandard.htm">字体表</a> 中的一个. 如果省略了 <em>FontName</em> 或此字体在系统中不存在, 则设置为之前的字体字型 (如果没有, 则为系统默认的 GUI 字型). 即使某些系统缺少首选字体, 这种特性也可以让窗体在多个系统上具有类似的字体. 例如, 按顺序执行下列命令, Verdana 字体优先于 Arial, 而 Arial 字体优先于 MS sans serif:</p>
<pre>gui, font,, MS sans serif
gui, font,, Arial
gui, font,, Verdana  <em>; 首选字体.</em></pre>
<p>如果 <em>Options</em> 参数为空, 则使用之前的字体属性. 或者可以在其中指定下列的一个或多个选项字母:</p>
<p><strong>C</strong>: 颜色名称 (参见 <a href="Progress.htm#colors">颜色图表</a>) 或 RGB 值 -- 或指定单词 Default 来使用系统默认的颜色 (大多数系统上默认颜色为黑色). 例如: cRed, cFFFFAA, cDefault. 注意: <a href="GuiControls.htm#Button">Buttons</a> 不受自定义颜色的影响. 此外, 通过包含 C 选项创建带有字体颜色的一些控件时不会受到当前选项的影响. 例如: <em>Gui, Add, Text, cRed, My Text</em></p>
<p><strong>S</strong>: 字体大小 (单位为磅). 例如: s12 (规定为十进制, 而不是十六进制)</p>
<p><strong>W</strong>: 字体粗细, 这是介于 1 和 1000 之间的数字 (400 为标准大小而 700 为粗体). 例如: w600 (规定为十进制而不是十六进制)</p>
<p>还支持使用下列单词: <strong>bold</strong>, <em>italic</em>, <s>strike</s>, <u>underline</u> 和 norm. 指定 <em>Norm</em> 则让字体恢复标准的粗细并去除斜体, 删除线和下划线效果 (但保持现有的颜色和大小). 可以使用 norm 去除所有属性然后有选择的设置其他属性. 例如, 指定 <em>norm italic</em> 将设置字体为标准然后增加斜体属性. </p>
<p>要指定多个选项, 在选项间使用空格分隔. 例如: cBlue s12 bold</p>
<p>如果一个脚本创建了 <a href="#MultiWin">多个 GUI 窗体</a>, 那么其中的每个窗体都会记住它自己的 "当前字体" 属性, 可以用于后面创建的控件.</p>
<p>相关提示, 操作系统提供了标准的对话框, 可以让用户选取字体, 颜色或图标. 通过 <a href="DllCall.htm">DllCall()</a> 可以显示这些对话框, 演示例子参见 <a href="http://www.autohotkey.com/forum/topic17230.html">www.autohotkey.com/forum/topic17230.html</a>.</p>
<p id="fontq"><strong>Q</strong>: <span class="ver">[AHK_L 19+]:</span> 文本描绘品质. 例如: q3. Q 后应该跟着下面表格中的一个数字:</p>
<table class="info">
  <tr><td>0 = DEFAULT_QUALITY</td><td>保持字体外观.</td></tr>
  <tr><td>1 = DRAFT_QUALITY</td><td>字体外观没有使用 PROOF_QUALITY 值那么重要.</td></tr>
  <tr><td>2 = PROOF_QUALITY</td><td>字体的字符品质比准确符合逻辑字体属性更重要.</td></tr>
  <tr><td>3 = NONANTIALIASED_QUALITY</td><td>不对字体修边, 即不进行平滑处理.</td></tr>
  <tr><td>4 = ANTIALIASED_QUALITY</td><td>如果字体支持并且字体不会太小或太大时, 对字体进行修边或平滑.</td></tr>
  <tr><td>5 = CLEARTYPE_QUALITY</td><td>Windows XP 或更高版本系统: 如果设置, 则使用 ClearType 抗锯齿方法描绘文本 (尽可能).</td></tr>
</table>
<p>关于这些值的含义的更多细节, 参见 <a href="http://msdn.microsoft.com/en-us/library/dd183499.aspx">MSDN: CreateFont</a>.</p>
<p>由于通常使用最好的品质作为默认设置, 此特性往往用于在特殊情况时禁用抗锯齿效果, 这样可以让文本更清晰.</p>
<h2 id="Color">Gui, Color [, WindowColor, ControlColor]</h2>
<p>设置窗体和/或其控件的背景颜色. 设置 <em>WindowColor</em> 为 GUI 窗体自己的背景颜色. <em>ControlColor</em> 应用于窗体中所有现在的和将来的控件 (尽管某些类型的控件不支持自定义颜色). 尽管 <a href="ListView.htm">ListViews</a> 和 <a href="TreeView.htm">TreeViews</a> 的初始背景颜色由当前的 <em>ControlColor</em> 决定, 但之后 <em>ControlColor</em> 颜色的改变不会影响它们. 这时应该使用 <em>GuiControl +BackgroundFF9977, MyListView</em> 来明确改变它们的背景颜色.</p>
<p>让两个参数中的某个留空可以保持当前的颜色设置. 否则, 指定 16 种 <a href="Progress.htm#colors">HTML 基础颜色</a> 之一或一个 6 位的 RGB 颜色值 (0X 前缀可以省略), 或指定单词 Default 来恢复到默认的颜色. 例如: Silver, FFFFAA, 0xFFFFAA, Default</p>
<p>默认情况下, 窗体的背景颜色为系统按钮的颜色, 而控件的背景颜色为系统默认窗体颜色 (通常为白色).</p>
<p><a href="#Menu">菜单栏</a> 及其子菜单的颜色这样可以改变, 例如: <a href="Menu.htm">Menu</a>, MyMenuBar, Color, White</p>
<p>在 Windows 2000/XP 或更高版本的系统中要使窗体的背景透明, 使用 <a href="WinSet.htm#TransColor">WinSet TransColor</a>. 然而, 如果在进行这样的操作前没有通过 "Gui, Color" 为窗体设置自定义的颜色, 那么按钮也将变成透明的. 要避免此问题, 应首先为窗体设置一个自定义的颜色然后让此颜色透明. 例如:</p>
<pre>Gui, Color, EEAA99
Gui +LastFound  <em>; 让 GUI 窗体成为 <a href="../LastFoundWindow.htm">最近找到的窗口</a> 以用于下一行的命令.</em>
WinSet, TransColor, EEAA99</pre>
<p>此外如果要移除背景透明的窗体的边框和标题栏, 请在设置窗体为透明 <strong>后</strong> 使用下面的命令:</p>
<pre>Gui -Caption  <em>; 如果是第二个窗体则使用 <i>Gui, 2:-Caption</i>, 等.</em></pre>
<p>为了阐明上面的情况, 请参见此页面底部的屏幕显示 (OSD) 的例子.</p>

<h2 id="Margin">Gui, Margin [, X, Y]</h2>
<p>此命令用来为窗体上没有明确指定 <a href="#XY">X 或 Y 坐标</a> 的控件设置在自动排列时距离窗体边界的距离, <strong>X</strong> 为控件距离窗体左/右边界的距离, <strong>Y</strong> 为控件距离窗体上/下边界的距离, 它们的单位为像素. 并且使用此边距设置自动排列控件彼此间在水平和垂直方向上的距离. 最后, 在首次使用 <a href="#Show">Gui Show</a> 计算窗体的大小时也需要考虑此边距 (当没有明确指定窗体大小时).</p>
<p>如果没有使用此命令, 当添加首个控件到窗体时, 窗体会根据当前选择 <a href="#Font">字体</a> 的大小按比例计算出默认的边距 (上下边距为字体高度的 0.75 倍, 而左右边距为字体高度的 1.25 倍).</p>
<p>尽管在添加控件的过程中可以改变边距, 但这仅影响后面添加的控件, 而不影响现有的. 最后, X 或 Y 的其中任意一个可以留空来保持相应的边距不变.</p>

<h2 id="Options">Gui, +/-Option1 +/-Option2 ...</h2>
<p>在 GUI 命令后可以指定一个或多个选项. 考虑到效率的原因, 最好在创建窗体前 (即在使用任何其他子命令例如 <a href="#Add">Gui Add</a> 之前) 使用一行语句指定所有的选项.</p>
<p>此命令的效果是累积的; 即它只改变那些明确指定的选项, 所有其他选项则保持不变.</p>
<p>在选项前指定一个加号表示增加此选项, 而减号表示移除它. 例如:</p>
<pre>Gui +Resize -MaximizeBox  <em>; 改变 <a href="#DefaultWin">默认</a> GUI 窗体的设置.</em>
Gui <strong>2:</strong>+Resize -MaximizeBox  <em>; 改变第二个 GUI 窗体的设置.</em></pre>
<p><strong>AlwaysOnTop</strong>: 让窗体置顶, 和 "<a href="WinSet.htm">WinSet</a> AlwaysOnTop" 的效果相同.</p>
<p> <strong>Border</strong>: 为窗体增加一个细边框. 此选项不常用.</p>
<p><strong>Caption</strong> (默认具有此选项): 为窗体增加标题栏和一个粗边框. 如果要移除将使用 <a href="WinSet.htm#TransColor#TransColor">WinSet TransColor</a> 设置透明的窗体的标题栏, 那么需要在设置 TransColor 后移除它.</p>
<p><strong><a name="Delimiter"></a>Delimiter</strong>: 指定管道 (|) 外的其他字符作为窗体的字段分隔符, 每当通过 <a href="#Add">Gui Add</a> 添加, 通过 <a href="GuiControl.htm">GuiControl</a> 修改或通过 <a href="#Submit">Gui Submit</a> 或 <a href="GuiControlGet.htm">GuiControlGet</a> 获取的控件内容含有多个字段时使用的分隔符. 在单词 Delimiter 后紧跟着单个字符. 例如, <em>Gui +Delimiter`n</em> 将使用换行符, 这可能特别适合于 <a href="../Scripts.htm#continuation">字串分段</a>. 同样, 使用 <em>Gui +Delimiter|</em> 将恢复为默认的分隔符. 要使用空格或 Tab, 指定 <em>Gui +DelimiterSpace </em>或 <em>Gui +DelimiterTab</em>. 一旦改变数据分隔符, 它会影响作用于这个特殊窗体的所有现有和后续的 <a href="../misc/Threads.htm">线程</a>.</p>
<p><strong>Disabled</strong>: 禁用窗体, 阻止用户和窗体中的控件交互. 此选项常用于含有子窗体的窗体 (参见 <a href="#Owner">Owner</a>).</p>
<p><strong><a name="PlusLabel"></a>Label</strong> <span class="ver">[v1.0.44.09+]:</span> 为当前窗体的 <a href="#Labels">特殊标签</a> 指定自定义名称. 例如, <em>Gui 2:+LabelMyGui</em> 将使用标签 MyGuiClose 和 MyGuiSize (如果它们存在的话) 代替 2GuiClose 和 2GuiSize. 换句话说, 在所有 <a href="#Labels">特殊标签</a> 的名称中字符串 "2Gui" 被替换为 "MyGui". 这样可以让多个窗体使用一套相同的标签 (此时脚本可以根据 <a href="../Variables.htm#Gui">A_Gui</a> 变量确定运行的子程序的是哪个窗体).</p>
<p><strong><a name="LastFound"></a>LastFound</strong>: 设置窗体为 <a href="../LastFoundWindow.htm">最近找到的窗口</a> (虽然对于 <a href="#DefaultWin">Gui 线程</a> 这是多余的, 因为它自动设置了), 这样允许类似 <a href="WinSet.htm">WinSet</a> 这样的命令对此窗口进行操作, 即使它当前为隐藏状态 (即不需要使用 <a href="DetectHiddenWindows.htm">DetectHiddenWindows</a>). 需要在显示窗体之前改变其属性时, 这是非常有用的. 例如:</p>
<pre>Gui +LastFound
WinSet, TransColor, %CustomColor% 150
Gui Show</pre>
<p><strong><a name="LastFoundExist"></a>LastFoundExist</strong> <span class="ver">[v1.0.43.09+]:</span> 和其他选项不同, LastFoundExist 选项只有在单独使用时才有效, 即在同一行中不能使用其他选项. <em>+LastFoundExist</em> 的效果与 <em>+LastFound</em> 相同, 除了如果窗口还不存在时不会创建窗口. 此选项的主要用途是判断指定的窗口是否存在. 例如:</p>
<pre>Gui 2:+LastFoundExist
IfWinExist
    MsgBox GUI #2 already exists.</pre>
<p><strong>MaximizeBox</strong>: 启用标题栏上的最大化按钮. 下面的 <em>Resize</em> 选项也含有此效果. </p>
<p><strong>MinimizeBox</strong> (默认含有此选项): 启用标题栏上的最小化按钮.</p>
<p><strong><a name="MinSize"></a>MinSize</strong> 和 <strong>MaxSize</strong> <span class="ver">[v1.0.44.13+]:</span> 限定窗体的最小尺寸和最大尺寸, 例如当用户拖动窗体边框改变其大小时. 指定不带后缀的单词 <em>MinSize</em> 和/或 <em>MaxSize</em> 来使用窗体当前尺寸作为限制大小 (如果没有窗体当前尺寸, 将使用首次 <a href="#Show">Gui Show</a> 时显示的尺寸). 还可以在后面加上宽度, 后面跟着一个 X 和高度; 例如: <em>Gui +Resize +MinSize640x480</em>. 它们指定了以像素为单位的窗体客户区 (不包括边框, 标题栏和 <a href="#Menu">菜单栏</a>) 的大小. 指定每个数字为十进制, 而不是十六进制.</p>
<p>高度或宽度可以省略以保持不变 (例如 <em>+MinSize640x</em> 或 <em>+MinSizex480</em>). 而且可以多次指定 Min/MaxSize 以便在一个方向上使用窗体当前的尺寸而另一个则使用指定的大小. 例如, <em>+MinSize +MinSize640x</em> 表示最小高度限制为窗体当前的大小而最小宽度限制为 640.</p>
<p>如果从没使用 <em>MinSize</em> 和 <em>MaxSize</em>, 则使用操作系统的默认值 (同样地, 使用 <em>Gui -MinSize -MaxSize</em> 可以恢复为此默认值). 注意: 必须含有 <a href="#Resize">+Resize</a> 才能允许用户调节窗体的大小.</p>
<p><strong><a name="OwnDialogs"></a>OwnDialogs</strong>: 在每个 <a href="../misc/Threads.htm">线程</a> (例如 ButtonOK 子线程) 中指定 <em>Gui +OwnDialogs</em>, 这样所有后续的 <a href="MsgBox.htm">MsgBox</a>, <a href="InputBox.htm">InputBox</a>, <a href="FileSelectFile.htm">FileSelectFile</a> 和 <a href="FileSelectFolder.htm">FileSelectFolder</a> 对话框则会成为当前窗体的子窗体. 这时这些对话框成为模式对话框, 也就是说用户必须先关闭这些对话框才能和它们的父窗体进行交互. 与之相比, <a href="ToolTip.htm">ToolTip</a>, <a href="Progress.htm">Progress</a> 和 <a href="Progress.htm">SplashImage</a> 窗体即使成为其他窗体的子窗体也为非模式的; 它们仅仅是永远显示在其父窗体的上面. 在模式和非模式窗体两种情况中, 当它们的父窗体 <a href="#Destroy">销毁</a> 时它们也会被自动销毁.</p>
<p>一般情况下打开这个设置后不需要再切换到关闭因为它不影响其他 <a href="../misc/Threads.htm">线程</a>. 但是, 如果一个线程需要同时显示从属和非从属对话框, 它可以通过 <em>Gui -OwnDialogs</em> 关闭此设置.</p>
<p>如果在前缀中没有指定窗体编号 -- 例如使用 <em>Gui +OwnDialogs</em> 而不是 <em>Gui 2:+OwnDialogs</em> -- 则当前 <a href="#DefaultWin">线程的默认窗体</a> 将拥有这些从属的对话框.</p>
<p><strong><a name="Owner"></a>Owner</strong>: 使用 <em>+owner</em> 可以让当前窗体从属于另一个窗体 (但一旦窗体创建后, <em>-owner</em> 则没有效果). 默认情况下一个从属的窗体不会显示在任务栏, 并且它总是显示在其父窗体的上面. 当其父窗体销毁时它也被自动销毁. 必须在父窗体创建 <u>后</u> 但在子窗体创建 <u>前</u> (即在类似 <a href="#Add">Gui Add</a> 这样的命令之前) 使用 <em>+Owner</em>. +owner 有两种使用方法, 如下所示:</p>
<pre>gui, 2:+owner1  <em>; 让窗体 #2 成为窗体 #1 的子窗体.</em>
gui, 2:+owner  <em>; 让窗体 #2 成为 <a href="Menu.htm#MainWindow">脚本主窗口</a> 的子窗体这样可以避免显示任务栏按钮.</em></pre>
<p>当某个子窗体显示时要阻止用户与其父窗体交互, 请使用 <em>Gui +Disabled</em> 禁用父窗体. 之后 (当子窗体取消或销毁时), 通过 <em>Gui -Disabled</em> 重新启用父窗体. 在取消或销毁子窗体前这样做将使父窗体自动有效.</p>
<p><strong><a name="Resize"></a>Resize</strong>: 此选项允许用户重新设置窗体的大小, 并启用标题栏上的最大化按钮. 要禁用最大化按钮, 请在选项中指定 <em>+Resize -MaximizeBox</em>.</p>
<p><strong>SysMenu</strong> (默认含有此选项): 指定 -SysMenu (负 SysMenu) 可以删除点击窗体左上角时弹出的系统菜单和图标. 同时也删除标题栏上的最小化, 最大化和关闭按钮.</p>
<p><strong><a name="Theme"></a>Theme</strong>: 指定 -Theme 可以让所有后续创建的控件在 Windows XP 以及更高版本的系统中使用经典主题外观. 之后要创建其他使用当前主题的控件时, 通过 +Theme 把设置切换回来. 注意: 此选项对 Windows XP 之前的操作系统无效, 如果 XP 系统当前使用经典主题则此选项也无效. 最后, 对于一些控件还可以通过在其选项中指定 +Theme 或 -Theme 来改变此设置.</p>
<p><strong>ToolWindow</strong>: 让窗体显示细标题栏同时去除任务栏按钮.</p>
<p><strong>(未命名样式)</strong>: 在十进制或十六进制的 <a href="../misc/Styles.htm">样式编号</a> 前加上加号或减号表示添加或删除此样式.</p>
<p><strong>(未命名扩展样式)</strong>: 在字母 E 和十进制或十六进制的扩展样式编号前加上加号或减号表示添加或删除此扩展样式. 例如, +E0x40000 表示添加 WS_EX_APPWINDOW 样式, 此样式让窗体显示任务栏按钮. 尽管这里没有列出其他的扩展样式编号, 但可以通过在 <a href="http://www.microsoft.com">www.microsoft.com</a> 搜索 WS_EX_APPWINDOW 找到它们.</p>

<h2 id="Menu">Gui, Menu [, MenuName]</h2>
<p>为窗体增加一个菜单栏. 使用 <a href="Menu.htm">Menu</a> 命令可以创建一个普通的菜单. 例如:</p>
<pre>Menu, FileMenu, Add, &amp;Open    Ctrl+O, MenuFileOpen  <em>; 关于 Ctrl+O 参见后面说明.</em>
Menu, FileMenu, Add, E&amp;xit, MenuHandler
Menu, HelpMenu, Add, &amp;About, MenuHandler
Menu, MyMenuBar, Add, &amp;File, :FileMenu  <em>; 附加上面的两个子菜单.</em>
Menu, MyMenuBar, Add, &amp;Help, :HelpMenu
<strong>Gui, Menu, MyMenuBar</strong></pre>
<p>注意在首行中, &amp;Open 后面跟着 Ctrl+O(它们之间用 Tab 分隔). 这表示用户可以按下快捷键代替选择菜单项来执行操作. 要在脚本中启用这样的快捷键, 请使用上下文相关热键:</p>
<pre><a href="_IfWinActive.htm">#IfWinActive</a> GUI Window's Title ahk_class AutoHotkeyGUI
^o::  <em>; 热键 Ctrl+O.</em>
MenuFileOpen:
Gui <a href="#OwnDialogs">+OwnDialogs</a>  <em>; 强制用户在回到主界面前必须响应 FileSelectFile 对话框.</em>
<a href="FileSelectFile.htm">FileSelectFile</a>, SelectedFile
MsgBox You selected the file %SelectedFile%.
return

<em>; 如果脚本需要在 Windows 95/98/Me 系统上运行, 那么下面这部分是必须的:</em>
#IfWinActive
$^o::Send ^o</pre>
<p>要移除窗体当前的菜单栏, 请使用 <em>Gui Menu</em> (即省略最后一个参数).</p>
<p>一旦菜单被设置为窗体的菜单栏, 它就不能用于弹出菜单或子菜单. 这是因为在菜单栏内部使用了一种不同的格式 (不过这只限制菜单栏自身, 而不是其子菜单). 如果您一定要这样实现, 那么先创建一个菜单用于菜单栏, 再创建另一个相同的菜单用于其他目的.</p>
<p>对当前正用于菜单栏 (在某些情况下包括其子菜单) 的菜单使用某些破坏性的 <a href="Menu.htm">菜单子命令</a> 例如 Delete 和 DeleteAll 时, 这些命令会无效并显示出现错误对话框 (可以使用 <a href="Menu.htm">UseErrorLevel</a> 来避免). 可以使用下列步骤改变窗体菜单栏中的菜单: 1) 使用 <em>Gui Menu</em> (省略 <em>MenuName</em>) 让菜单从窗体中分离; 2) 改变菜单; 3) 通过 <em>Gui, Menu, MyMenuBar</em> 重新把菜单附加到窗体</p>

<h2 id="Minimize"><a name="Maximize"></a><a name="Restore"></a><a name="Hide"></a>Gui, Hide / Minimize / Maximize / Restore</h2>
<p>"Gui Hide" 相当于 <a href="#Cancel">Gui Cancel</a>. 其他三个命令则显示窗体 (必要时) 然后分别对窗体进行最小化/最大化/还原操作. 如果由于之前使用 <a href="#Destroy">Gui Destroy</a> 销毁了窗体或其他原因使得窗体不存在, 这些命令没有效果.</p>

<h2 id="Flash">Gui, Flash [, Off]</h2>
<p>闪烁窗体的任务栏按钮. 这是通过反转窗体的标题栏和/或任务栏按钮 (如果有的话) 的颜色实现的. 可以加上选项 OFF 让标题栏和任务栏按钮恢复到它们最初的颜色 (但实际效果可能受操作系统版本影响). 在下面的例子中, 窗体将闪烁三次, 因为每对闪烁都会在对它们反转后恢复原来的外观:</p>
<pre>Loop 6
{
    Gui Flash
    sleep, 500  <em>; 这个时间值十分敏感; 改变它可能引起异常.</em>
}</pre>

<h2 id="Default">Gui, 2:Default</h2>
<p>改变 <a href="../misc/Threads.htm">当前线程</a> 的默认 <a href="#MultiWin">GUI 窗体编号</a>, 这是在没有指定窗体编号时用于 <a href="GuiControl.htm">GuiControl</a>, <a href="GuiControlGet.htm">GuiControlGet</a> 和 Gui 命令自身的默认窗体. 下面这个例子把默认窗体编号改为 2: <em>Gui 2:Default</em>. 参见 <a href="#DefaultWin">线程的默认窗体</a> 了解关于默认窗体的更多细节.</p>

<h2 id="Position">通过 SmartGUI Creator 创建窗体布局 </h2>
<p>虽然下一段中描述了简单的布局选项, 但您会发现使用 Rajat 的 SmartGUI Creator 来创建会更简单因为它是完全可视化的; 即 "所见即所得". SmartGUI Creator 是免费的, 可以从 <a href="http://www.autohotkey.com/docs/SmartGUI/">www.autohotkey.com/docs/SmartGUI/</a> 下载.</p>

<h2 id="PosSize">控件的位置和大小</h2>
<p>如果在 <em>Options</em> 中省略了某些尺寸和/坐标, 则会根据前一个控件确定其位置, 根据控件的类型和内容确定大小. </p>
<p>支持下列选项:</p>
<p><strong><a name="R"></a>R</strong>: 指定文本的行数 (可以为浮点数如 R2.5). 使用 <strong>R</strong> 通常比 <strong>H</strong> (高度) 更合适. 如果同时指定 <strong>R</strong> 和 <strong>H</strong> 选项, 则 <strong>R</strong> 优先考虑. 对于 GroupBox, 此选项设置在框中可以容纳的控件数量. 对于 <a href="GuiControls.htm#DropDownList">DropDownList</a>, <a href="GuiControls.htm#ComboBox">ComboBox</a> 和 <a href="GuiControls.htm#ListBox">ListBox</a>, 此选项设置在控件的列表部分一次可以看见的项目数目 (但在 Windows XP 及更高版本系统中, 对于 DropDownList 和 ComboBox 控件常常同时省略 <strong>R</strong> 和 <strong>H</strong> 选项, 这样可以让弹出的列表自动设置为用户桌面的可用高度). 对于其他类型的控件, <strong>R</strong> 表示控件内可见的文本行数.</p>
<p><strong>W</strong>: 宽度, 单位为像素. 如果省略, 对于某些控件则根据其内容自动计算宽度. 其他类型的控件具有下列默认的宽度值:<br>
  标签页控件: 30 倍的当前字体大小加上 3 倍的 <a href="#Margin">X-margin</a> (行边距).<br>
垂直进度条: 两倍的当前字体大小.<br>
水平进度条, 水平滑动条, DropDownList, ComboBox, ListBox, GroupBox, Edit, and Hotkey: 15 倍的当前字体大小 (GroupBoxe 例外, 其默认宽度为 18 倍这样可以显示内部的边距). </p>
<p> <strong>H</strong>: 高度, 单位为像素. 如果 <strong>H</strong> 和 <strong>R</strong> 选项同时省略, 则 DropDownList, ComboBox, ListBox 和初始内容为空的多行 Edit 控件默认为 3 行; GroupBox 默认为 2 行; 垂直滑动条和进度条默认为 5 行; 水平滑动条默认为 30 像素 (没有指定其厚度时); 水平进度条默认为 2 倍的当前字体大小; Hotkey 控件默认为 1 行; 而 Tab 控件默认为 10 行. 对于其他类型的控件, 则根据它们的内容自动计算高度. 请注意对于 DropDownList 和 ComboBox, <strong>H</strong> 为控件总是可见的部分 (大概指列表上面的框) 和其列表部分相加的高度 (但即使高度设置很小, 也会在下拉列表中至少显示一个项目). 同时对于所有类型的控件, 通过 <strong>R</strong> 选项指定行数比使用 <strong>H</strong> 更可取, 因为这样可以避免在控件中显示部分/不完整的文本行.</p>
<p><strong>wp+n</strong>, <strong>hp+n</strong>, <strong>wp-n</strong>, <strong>hp-n</strong> (其中 <strong>n</strong> 可以为任意数字) 可以用来设置控件的宽度和/或高度等于前一个添加控件的宽度或高度, 可以使用加号或减号进行调整. 例如, wp 将设置控件的宽度等于之前的控件, 而 wp-50 则设置宽度为之前的控件宽度减去 50 像素.</p>
<p><strong><a name="XY"></a>X</strong>: 控件的 X 坐标. 例如, 指定 "x0 y0" 则把控件放置到窗体客户区的左上角, 窗体客户区是在标题栏和菜单栏 (如果有的话) 下面的区域. 如果省略了 <strong>X</strong> 但指定了 <strong>Y</strong>, 则控件将被放置在之前所有控件的右边 (即其 X 坐标为前一个控件的 X 坐标加上前一个控件的宽度, 即前一个坐标右边的位置), 可以理解为开始了一个新 "列".</p>
<p><strong>Y</strong>: 控件的 Y 坐标. 如果省略了 <strong>Y</strong> 但指定了 <strong>X</strong>, 则控件将被放置在之前所有控件的下面 , 可以理解为开始了一个新 "行". </p>
<p><strong>X, </strong><strong>Y</strong> 的其中一个或同时省略时, 可以在您对控件的大小或字体进行改变时自动调整 GUI 布局. 与之相比, 如果为每个控件指定了绝对位置则当一个控件扩大或减小时需要为在此控件下面和/或右边的所有控件手动调整位置.</p>
<p>如果同时省略 <strong>X</strong> 和 <strong>Y</strong>, 则控件会放置在之前控件的下面, 中间加上标准的填充间距.</p>
<p><a name="PosPlus"></a>对于 <strong>X</strong> 和 <strong>Y</strong>, 还可以在后面加上一个加号来确定控件相对于前一个添加控件的右边或底部边缘 (分别地) 的位置. 例如, 指定 Y+10 将把控件放置在前一个控件底部下面 10 个像素的位置, 而不使用标准的填充间距. 同样地, 指定 X+10 将把控件放置在前一个控件右边缘的右边 10 个像素的位置. 由于负数例如 X-10 表示绝对的位置, 因此要使用一个负的位置偏移, 需要在前面加上一个加号. 例如: X+-10</p>
<p><strong>xp+n</strong>, <strong>yp+n</strong>, <strong>xp-n</strong>, <strong>yp-n</strong> (其中 <strong>n</strong> 可以为任意数字) 可以用来指定控件相对于前一个控件左上角的位置, 此选项常用于 <a href="GuiControls.htm#GroupBox">GroupBox</a> 中的被封装控件.</p>
<p><strong>xm</strong> 和 <strong>ym</strong> 分别可以把控件放置在窗体最左边和最上边的 <a href="#Margin">边缘</a> (它们后面还可以跟着一个加号/减号和一个数字). 指定 <strong>ym</strong> 而省略 X 坐标, 将把控件放置在窗体的最上面但在之前所有控件的右边, 可以理解为开始了一个新 "列". 反之亦然.</p>
<p><a name="xs"></a><strong>xs</strong> 和 <strong>ys</strong>: 它们类似于 <strong>xm</strong> 和 <strong>ym </strong>, 区别在于它们是相对于前一个使用选项 <a href="#Section">Section</a> 添加的控件坐标 (在窗体中创建首个控件时总是开始一个新列, 即使没有指定此选项). 指定 <strong>ys</strong> 而省略 X 坐标, 将把控件放置在之前保存的 Y 坐标 (即最近一次使用 Section 选项添加的控件的 Y 坐标) 但在最近一次使用 <a href="#Section">Section</a> 后添加的所有控件右边; 这可以理解为在同一控件段中开始一个新列. 例如:</p>
<pre>gui, add, edit, w600  <em>; 在窗体的顶部添加一个非常宽的编辑控件.</em>
gui, add, text, <strong>section</strong>, First Name:  <em>; 保存此控件位置并定义一个新控件段.</em>
gui, add, text,, Last Name:
gui, add, edit, <strong>ys</strong>  <em>; 在此控件段中开始一个新列.</em>
gui, add, edit
gui, show</pre>
<p>反过来 (指定 <strong>xs</strong> 但省略 Y 坐标) 也是一样的.</p>
<p><strong>xs</strong> 和 <strong>ys</strong> 后面可以跟着一个加号/减号和一个数字. 并且还可以在控件的选项中同时指定单词 <a href="#Section">Section</a> 和 xs/ys; 这样可以让当前控件使用之前的段, 但为后续控件定义一个新段.</p>

<h2 id="Events">储存和响应用户的输入</h2>
<p><strong><a name="var"></a>V</strong>: 变量. 为一个控件分配一个关联的变量. 在字母 V 后指定一个变量名, 此变量将为全局变量 (或一个指向全局变量的 <a href="../Functions.htm#ByRef">ByRef 局部变量</a>, 在 1.0.46.01+ 版本中还可能为 <a href="../Functions.htm#static">静态变量</a>). 例如, 指定 <em><strong>v</strong>MyEdit</em> 后, 每当执行 <a href="#Submit">Gui Submit</a> 命令时将把控件的内容保存到变量 <em>MyEdit</em>. 如果控件是不可输入类型 -- 例如 Text 控件或 GroupBox -- 为其分配的关联变量作为控件的唯一标识符仍可用于 <a href="GuiControl.htm">GuiControl, </a><a href="GuiControlGet.htm">GuiControlGet</a>, and <a href="../Variables.htm#GuiControl">A_GuiControl</a>. 注意: <a href="#Submit">Gui Submit</a> 不会改变不可输入型控件关联变量的内容 (例如 Text 和 GroupBox), 也不会改变其他某些控件的内容, 如同在这些控件描述部分注明的一样 (例如 <a href="ListView.htm">ListView</a> 和 <a href="TreeView.htm">TreeView</a>).</p>
<p><strong><a name="label"></a>G</strong>: Gosub (g-label). 当用户点击或改变控件内容时自动运行子程序. 在字母 G 后指定需要执行的标签名称. 指定 gCancel 暗示执行 <a href="#Cancel">Gui Cancel</a> (但如果在脚本中存在名称为 "Cancel" 的标签, 则会执行此标签). 在子程序中可以引用下列的内置变量: <a href="../Variables.htm#Gui">A_Gui</a>, <a href="../Variables.htm#GuiControl">A_GuiControl</a>, <a href="../Variables.htm#GuiEvent">A_GuiEvent</a> 和 <a href="../Variables.htm#EventInfo">A_EventInfo</a>.</p>
<h2 id="OtherOptions">控件: 一般样式和其他选项</h2>
<p>注意: 选项前的符号省略时, 默认为加号; 例如, Wrap 等同于 +Wrap. 相反地, -Wrap 将去除自动换行属性.</p>
<p><strong><a name="AltSubmit"></a>AltSubmit</strong>: 使用备用的提交方法. 对于 DropDownList, ComboBox 和 ListBox 此选项会让 <a href="#Submit">Gui Submit</a> 命令保存选择的项目的位置而不是其文本. 如果没有选项项目, 则对于 ComboBox 控件会保存其编辑区域的文本; 同样地, 对于 DropDownList 或 ListBox 则它们的关联 <a href="#var">输出变量</a> 为空. 注意: AltSubmit 选项也会影响 <a href="GuiControlGet.htm">GuiControlGet</a> 获取这些控件内容时的行为.</p>
<p><strong>C</strong>: 文本颜色 (对 <a href="GuiControls.htm#Button">按钮</a> 控件无效). 指定字母 C 后面跟着一个颜色名称 (参见 <a href="Progress.htm#colors">颜色图表</a>) 或 RGB 值 (0x 前缀可以省略). 示例: cRed, cFF2211, c0xFF2211, cDefault</p>
<p><strong>Disabled</strong>: 让可输入型控件变为灰色禁用状态, 这样可以防止用户的焦点和输入. 以后可以使用 "<a href="GuiControl.htm">GuiControl</a> Enable" 启用控件. 注意: 要让编辑控件为只读状态, 请指定 ReadOnly 选项代替. 并且, 还可以在单词 Disabled 后紧跟着一个 0 或 1 来表示控件的初始状态 (0 为启用而 1 为禁用). 换句话说, <em>Disabled</em> 和 <em>Disabled%VarContainingOne%</em> 是一样的.</p>
<p><strong>Hidden</strong>: 让控件初始为隐藏状态. 以后可以使用 "<a href="GuiControl.htm">GuiControl</a> Show" 让它显示. 可以在单词 Hidden 后紧跟着一个 0 或 1 来表示控件的初始状态 (0 为可见而 1 为隐藏). 换句话说, <em>Hidden</em> 和 <em>Hidden%VarContainingOne%</em> 是一样的.</p>
<p><strong>Left</strong>: 在控件的可用宽度内左对齐控件的文本.</p>
<p><strong>Right</strong>: 在控件的可用宽度内右对齐控件的文本. 对于复选框和单选按钮, 此选项也同时把方框放置在控件的右边而不是左边.</p>
<p><strong>Center</strong>: 在控件的可用宽度内居中对齐控件的文本. </p>
<p><strong><a name="Section"></a>Section</strong>: 定义一个新的控件段并保存当前控件的位置以便在之后创建含有 xs 和 ys 选项的控件时使用, 参考 <a href="#xs">上文描述</a>.</p>
<p><strong><a name="Tabstop" id="Tabstop"></a>Tabstop</strong>: 使用 -Tabstop (即负 Tabstop) 可以在用户按 TAB 键导航时跳过输入型控件.</p>
<p><strong><a name="Wrap"></a>Wrap</strong>: 让控件的文本自动换行. 因为几乎所有类型的控件在开始时都是启用自动换行的, 所以需要在 Wrap 前加上一个负号来禁用它.</p>
<p><strong>VScroll</strong>: 控件支持时为其提供一个垂直滚动条. </p>
<p><strong>HScroll</strong>: 控件支持时为其提供一个水平滚动条. 这个段落的剩余部分仅适用于 <a href="GuiControls.htm#ListBox">ListBox</a>. 可水平滚动的宽度默认为 ListBox 宽度的 3 倍. 要指定其他的滚动宽度, 请在单词 HScroll 后紧跟着一个数字表示. 例如, HScroll500 将在 ListBox 中使用 500 像素的滚动宽度. 但是, 如果指定的滚动宽度小于 ListBox 的宽度, 则不显示滚动条 (不过在这种含有 <em>HScroll</em> 的情况下, 可以在之后使用  <em><a href="GuiControl.htm">GuiControl</a>, +HScroll500, MyScrollBar</em> 添加水平滚动条, 否则是没办法添加的).</p>

<h2>控件: 特殊样式和选项</h2>
<p><strong><a name="BackgroundTrans"></a>BackgroundTrans</strong>: 使用透明的背景, 这样可以让任何一个在 Text, Picture 或 GroupBox 后面的控件显示出来. 例如, 在 Picture 控件上显示一个透明背景的 Text 可以让文字看起来就像图片的一部分. 以后可以使用 "<a href="GuiControl.htm">GuiControl</a> +background" 移除此选项. 参见 <a href="GuiControls.htm#PicAltSubmit">Picture 控件的 AltSubmit 选项部分</a> 来了解关于透明图像的更多细节. 已知限制: 对包含 <a href="ListView.htm">ListView</a> 的 <a href="GuiControls.htm#Tab">Tab 控件</a> 中的其他控件 BackgroundTrans 选项可能无法正确应用.</p>
<p><strong>-Background</strong> (即负 Background): 使用标准的背景颜色代替 "Gui Color" 命令设置的那个颜色. 此选项常用于让 Tab 控件使用其标准颜色代替窗体颜色. 以后可以使用 "<a href="GuiControl.htm">GuiControl</a> +background" 移除此选项.</p>
<p><strong>Border</strong>: 为控件增加一个细边框. 对于大多数控件不需要使用此选项因为它们已经含有特定于类型的边框. 添加一个边框到 <em>现有</em> 的控件时, 可能需要给控件的宽度和高度增加 1 个像素.</p>
<p><strong><a name="HwndOutputVar"></a>Hwnd</strong><em>OutputVar</em> <span class="ver">[v1.0.46.01+]:</span> 在 <a href="#Add">Gui Add</a> 中使用时, 此选项保存新创建的控件的窗口句柄 (HWND) 到 <em>OutputVar</em> 中. 例如: <em>Gui, Add, Edit, vMyEdit HwndMyEditHwnd</em> (如果在函数内部, <em>MyEditHwnd</em> 被视为 <a href="../Functions.htm#DynVar">函数动态变量</a>). 控件的 HWND 常用于 <a href="PostMessage.htm">PostMessage</a>, <a href="PostMessage.htm">SendMessage</a> 和 <a href="DllCall.htm">DllCall</a>. 它也可以直接作为 <a href="../LastFoundWindow.htm#id">ahk_id WinTitle</a> 使用 (即使在 <a href="DetectHiddenWindows.htm">DetectHiddenWindows</a> 为 Off 时这样也对隐藏的控件有效). 相关提示, 控件所在窗体的 HWND 可以在 <a href="#LastFoundExist">Gui 2:+LastFoundExist</a> 后执行 <a href="../Functions.htm#WinExist">WinExist()</a> 获取.</p>
<p><strong>Theme</strong>: 使用此选项可以让控件忽略窗体当前的主题设置. 请参见 <a href="#Theme">Gui +/-Theme</a> 了解详情.</p>
<p><strong>(未命名样式)</strong>: 在十进制或十六进制的 <a href="../misc/Styles.htm">样式编号</a> 前加上加号或减号表示添加或删除此样式. 如果省略了符号, 则默认为加号.</p>
<p><strong>(未命名扩展样式)</strong>: 在字母 E 和十进制或十六进制的扩展样式编号前加上加号或减号表示添加或删除此扩展样式. 如果省略了符号, 则默认为加号. 例如, E0x200 表示添加 WS_EX_CLIENTEDGE 样式, 它可以为图片和其他控件增加一个下沉的边框样式. 尽管这里没有列出其他的扩展样式编号 (因为很少使用它们), 但可以通过在 <a href="http://www.microsoft.com">www.microsoft.com</a> 搜索 WS_EX_CLIENTEDGE 找到它们.</p>

<h2 id="Remarks"><strong><a name="Labels"></a></strong>窗体事件</h2>
<p>如果在脚本中存在下列的标签 (子程序) 时, 它们会自动和一个 GUI 窗体关联:</p>
<p><strong><a name="GuiClose"></a>GuiClose</strong>: 使用下列其中一种方法关闭窗体时自动运行此子程序: 点击标题栏上的关闭按钮, 从标题栏中的系统菜单选择 "关闭" 或使用 <a href="WinClose.htm">WinClose</a> 关闭. 如果此标签不存在, 则关闭窗体只是简单地隐藏窗体, 与 <a href="#Cancel">Gui Cancel</a> 的效果一样. 在 GuiClose 中一个最常用的动作是 <a href="ExitApp.htm">ExitApp</a>; 例如:</p>
<pre>GuiClose:
ExitApp</pre>
<p><strong><a name="GuiEscape"></a>GuiEscape</strong>: 用户在 GUI 窗体活动时按下 Escape 后自动运行的子程序. 如果此标签不存在, 则按下 Escape 没有效果. 已知限制: 如果窗体中首个控件是禁用的 (可能与控件类型有关), 按下 Escape 时 GuiEscape 子程序不会运行. 产生这样的效果可能是受其他一些事件的影响.</p>
<p><strong><a name="GuiSize"></a>GuiSize</strong>: 对窗体调整大小, 最小化, 最大化或还原时自动运行的子程序. 内置变量 A_GuiWidth 和 A_GuiHeight 分别包含了窗体客户区调整后的宽度和高度, 窗体客户区不包括标题栏, 菜单栏和边框. 此外, <a href="../Variables.htm#EventInfo">A_EventInfo</a> 和 <a href="../misc/ErrorLevel.htm">ErrorLevel</a> 将同时包含下列数字的其中一个:</p>
<p>0: 还原窗体或通过像拖拉窗体边缘这样正常调节窗体大小时.<br>
  1: 最小化窗体.<br>
  2: 最大化窗体.</p>
<p>脚本中可以使用 GuiSize 调整控件的大小和位置来响应用户对窗体大小的改变. 通过 <a href="_Include.htm">#Include</a> 加载 <a href="http://www.autohotkey.net/%7ETitan/anchor.html">Titan 的 "Anchor" 脚本</a> 可以让这种处理更容易些.</p>
<p><strong><a name="GuiContextMenu"></a>GuiContextMenu</strong>: 当用户在窗体上除标题栏和菜单栏外的其他地方点击右键时自动运行此子程序. 当用户按下 Apps 键或 Shift-F10 时也会运行. 和其他多数的 GUI 标签不同, GuiContextMenu 可以含有多个并发 <a href="../misc/Threads.htm">线程</a>. 在 GuiContextMenu 子程序中可以引用下列内置变量:</p>
<ol>
  <li><a href="../Variables.htm#GuiControl">A_GuiControl</a>, 其包含了接收到事件 (如果没有则为空) 的控件的 <a href="../Variables.htm#GuiControl">文本或变量名称</a>.</li>
  <li><a href="../Variables.htm#EventInfo">A_EventInfo</a>: 当右键点击 ListBox, ListView 或 TreeView 控件时 (可以由上面的 A_GuiControl 得到), A_EventInfo 包含了右键点击的控件项目:<br>
    <a href="GuiControls.htm#ListBox">ListBox</a> 或 <a href="ListView.htm">ListView</a>: A_EventInfo 包含了当前焦点行号 (如果没有则为 0).<br>
    <a href="TreeView.htm">TreeView</a>: 右击时, A_EventInfo 包含了右击项目的 ID 编号 (如果用户点击到项目外的其他地方则为 0). 对于 AppsKey 和 Shift-F10, A_EventInfo 包含了选择的项目的 ID 编号.</li>
  <li>A_GuiX 和 A_GuiY, 包含了菜单显示位置的 X 和 Y 坐标 (例如 <em><a href="Menu.htm">Menu</a>, MyContext, Show, %A_GuiX%, %A_GuiY%</em>). 这里的坐标相对于窗体的左上角. </li>
  <li>A_GuiEvent, 当用户右击时包含单词 RightClick, 当用户按下 Apps 或 Shift-F10 时包含单词 Normal.</li>
</ol>
<p>注意: 由于 <a href="GuiControls.htm#Edit">Edit</a> 和 <a href="GuiControls.htm#MonthCal">MonthCal</a> 控件有它们自己的右键菜单, 所以点击这些控件时不会运行 GuiContextMenu.</p>
<p><strong><a name="GuiDropFiles"></a>GuiDropFiles</strong>: 拖放文件/文件夹到窗体上时运行此子程序 (如果此子程序已经在运行中, 则拖放事件被忽略). 在 GuiDropFiles 中可以引用下列内置变量:</p>
<ol>
  <li><a href="../Variables.htm#GuiControl">A_GuiControl</a>, 其包含了接收到释放文件 (如果没有则为空) 的控件的 <a href="../Variables.htm#GuiControl">文本或变量名称</a>.</li>
  <li><a href="../Variables.htm#EventInfo">A_EventInfo</a> 和 <a href="../misc/ErrorLevel.htm">ErrorLevel</a>, 包含了释放文件的数目.</li>
  <li>A_GuiX 和 A_GuiY, 包含了释放文件时的 X 和 Y 坐标 (相对于窗体的左上角). </li>
  <li>A_GuiEvent, 包含了被释放文件的名称, 文件名之间使用换行符 (`n) 分隔.</li>
</ol>
<p>要获取每个文件的名称, 请使用 <a href="LoopParse.htm">解析循环</a>, 如下所示:
</p>
<pre><em>; 示例 #1:</em>
Loop, parse, A_GuiEvent, `n
{
    MsgBox, 4,, File number %A_Index% is:`n%A_LoopField%.`n`nContinue?
    IfMsgBox, No, Break
}

<em>; 示例 #2: 要获取首个文件的名称, 参照此例:</em>
Loop, parse, A_GuiEvent, `n
{
    FirstFile = %A_LoopField%
    break
}

<em>; 示例 #3: 要按照文件名称的字母排序处理文件, 参照此例:</em>
FileList = %A_GuiEvent%
Sort, FileList
Loop, parse, FileList, `n
    MsgBox File number %A_Index% is:`n%A_LoopField%.</pre>
<p>要临时禁用窗体的拖放功能, 请使用 <em>Gui -E0x10</em> 移除窗体的 WS_EX_ACCEPTFILES 属性. 后面要启用拖放, 请使用 <em>Gui +E0x10</em>.</p>
<p><strong>检测和响应其他事件</strong>: 其他 GUI 事件可以使用 <a href="OnMessage.htm">OnMessage()</a> 检测和响应. 例如, 当用户把鼠标移动到特殊的控件时脚本可以通过 ToolTip 显示相关帮助. 参见演示 <a href="#ExToolTip">GUI ToolTip 示例</a>.</p>
<h2><a name="MultiWin" id="MultiWin"></a>创建多个 GUI 窗体</h2>
<p>对于非首个窗体, 需要在上面描述的特殊标签前加上窗体的编号作为前缀; 例如, 2GuiEscape 和 2GuiClose 为第二个窗体的默认标签. 要使用自定义的标签名称, 请参见 <a href="#PlusLabel">Gui +Label</a>.</p>
<p>每个脚本最多可以同时创建 99 个 GUI 窗体. 要对非 <a href="#DefaultWin">默认</a> 窗体进行操作, 需要在子命令前加上窗体编号和一个冒号, 例如:</p>
<pre>Gui, <strong>2:</strong>Add, Text,, Text for about-box.
Gui, <strong>2:</strong>Show</pre>
<p>执行 <a href="#Default">Gui 2:Default</a> 可以把第二个窗体设为默认窗体, 这样在上述语句中可以去除 "2:" 前缀. 此外, 在由窗体运行的 <a href="#DefaultWin">GUI 线程</a> 中对此窗体进行操作时可以不加前缀. </p>
<p>脚本的性能会随着窗体数量的增多而下降.</p>
<h2 id="DefaultWin">GUI 事件</strong>, 线程 和子程序</h2>
<p>GUI <a href="../misc/Threads.htm">线程</a> 是由 GUI 动作启动的. GUI 动作包括从 GUI 窗体的 <a href="#Menu">菜单栏</a> 中选择一个项目或触发其某个 <a href="#label">g-label</a> (例如按下按钮).</p>
<p>GUI 线程的 <strong>默认窗体编号</strong> 是运行此线程的窗体编号. 非 GUI 线程的默认窗体编号为 1.</p>
<p>当运行一个 GUI <a href="../misc/Threads.htm">线程</a> 时, 此线程的 <a href="../LastFoundWindow.htm">最近找到的窗口</a> 初始为此 GUI 窗体自身. 这样可以让窗体和控件操作命令 -- 例如 <a href="WinMove.htm">WinMove, </a><a href="WinHide.htm">WinHide</a>, <a href="WinSet.htm">WinSet</a>, <a href="WinSetTitle.htm">WinSetTitle</a> 和 <a href="ControlGetFocus.htm">ControlGetFocus</a> -- 对当前的 GUI 窗体 (即使窗体处于隐藏状态) 进行操作时省略 WinTitle 和 WinText.</p>
<p>当一个控件的 <a href="#label">g-label</a> 由于之前的点击还在运行时, 点击此控件不会有效果并且此事件被丢弃. 想要避免此问题, 在子程序的首行使用 <a href="Critical.htm">Critical</a> (不过, 这样也将缓冲/延迟其他 <a href="../misc/Threads.htm">线程</a> 例如按下的热键).</p>
<p>内置变量 A_Gui 和 A_GuiControl 包含了运行当前线程的窗体编号和控件 ID. 更多细节参见 <a href="../Variables.htm#Gui">A_Gui</a> 和 <a href="../Variables.htm#GuiControl">A_GuiControl</a>.</p>
<p>要让多个事件执行相同的子程序, 则在子程序上面连续指定这些标签. 例如:</p>
<pre>GuiEscape:
GuiClose:
ButtonCancel:
ExitApp  <em>; 上面的所有标签都会执行这个语句.</em></pre>
<p>所有的 GUI <a href="../misc/Threads.htm">线程</a> 都会以脚本设置的默认值启动, 例如 <a href="SendMode.htm">SendMode</a>. 这些默认值可以在 <a href="../Scripts.htm#auto">自动执行段</a> 改变.</p>
<h2 id="Navigate">键盘导航</h2>
<p>可以使用 TAB 键在 GUI 窗体中导航, 它可以移动键盘焦点到下一个可输入型控件中 (移除了 <a href="#Tabstop">Tabstop</a> 样式的控件被跳过). 导航的顺序由控件添加的顺序决定. 当首次显示一个窗体时, 键盘焦点将在首个具有 Tabstop 样式 (默认情况下大多数类型的控件都具有) 的可输入型控件上.</p>
<p><a name="ShortcutKey"></a>某些控件的名称中可以包含一个符号 (&amp;) 来创建此控件的键盘快捷键, 在控件名称中的快捷键字母会加上下划线显示 (取决于系统设置). 用户可以通过按下 ALT 和相应的字符来触发这样的快捷键. 对于按钮, 复选框和单选按钮, 按下相应的快捷键等于点击了按钮. 对于 GroupBox 和 Text 控件, 按下相应的快捷键则移动键盘焦点到此控件后 (不是指位置, 是创建顺序) 首个具有 <a href="#Tabstop">tabstop</a> 样式的可输入型控件中. 但是, 如果多个控件含有相同的快捷键, 按下此快捷键则键盘焦点会在这些控件中交替. </p>
<p>要在上面提及的类型的控件中显示一个原义的符号 (&amp;), 请指定两个连续的符号 (&amp;), 例如: Save &amp;&amp; Exit</p>
<h2 id="Appear">窗体外观</h2>
<p>当 GUI 窗体创建时, 它使用创建时的托盘图标作为其窗体图标. 因此, 如果要使用不同的图标, 需要在创建窗体前改变托盘图标. 例如: <em><a href="Menu.htm">Menu</a>, Tray, Icon, MyIcon.ico</em>. 还可以让窗体拥有一个不同的大图标而不用这个小图标 (大图标显示在 alt-tab 任务切换器中). 这个功能可以通过 DllCall 和 SendMessage 实现; 例如:</p>
<pre>hIcon32 := <a href="DllCall.htm">DllCall</a>("LoadImage", uint, 0
    , str, "My Icon.ico"  <em>; 图标文件 (此文件中可以包含多种尺寸图标).</em>
    , uint, 1  <em>; 图像类型: IMAGE_ICON</em>
    , int, 32, int, 32  <em>; 想要的高度和宽度 (可以让 LoadImage 确定哪个是最佳图标).</em>
    , uint, 0x10)  <em>; 标志: LR_LOADFROMFILE</em>
Gui +LastFound
<a href="PostMessage.htm">SendMessage</a>, 0x80, 1, hIcon32  <em>; 0x80 是 WM_SETICON; 而 1 表示 ICON_BIG (而 0 表示 ICON_SMALL).</em>
Gui Show</pre>
<p>由于操作系统的限制, 在 Windows XP 及更高版本的系统中, Checkbox, Radio button 和 GroupBox 控件中的文本不是使用默认颜色时将显示为经典主题外观.</p>
<p>相关主题: <a href="#Margin">窗体边距</a>.</p>
<h2 id="GenRemarks">一般说明</h2>
<p>可以使用 <a href="GuiControl.htm">GuiControl</a> 和 <a href="GuiControlGet.htm">GuiControlGet</a> 单独对 GUI 窗体中的控件进行操作.</p>
<p>每个 GUI 窗体最多可以包含 11,000 控件. 然而, 当控件数量超过 5000 时需要谨慎, 因为此时某些类型的控件可能让系统不稳定.</p>
<p>使用 GUI 命令的任何脚本会自动变成 <a href="_Persistent.htm">持续运行的</a> (即使 GUI 命令实际上从未执行过). 同时也会单实例运行, 除非使用 <a href="_SingleInstance.htm">#SingleInstance</a> 覆盖了默认设置.</p>
<h2>相关</h2>
<p><a href="GuiControl.htm">GuiControl</a>, <a href="GuiControlGet.htm">GuiControlGet</a>, <a href="Menu.htm">Menu</a>, <a href="GuiControls.htm">控件类型</a>, <a href="ListView.htm">ListView</a>, <a href="TreeView.htm">TreeView</a>, <a href="Control.htm">Control</a>, <a href="ControlGet.htm">ControlGet</a>, <a href="Progress.htm">SplashImage</a>, <a href="MsgBox.htm">MsgBox</a>, <a href="FileSelectFile.htm">FileSelectFile</a>, <a href="FileSelectFolder.htm">FileSelectFolder</a></p>
<h2 id="Examples">示例</h2>
<pre class="NoIndent"><em>; 示例: Achieve an effect similar to SplashTextOn:</em>

Gui, +AlwaysOnTop +Disabled -SysMenu +Owner <em>; +Owner avoids a taskbar button.</em>
Gui, Add, Text,, Some text to display. Gui, Show, NoActivate, Title of Window <em>; NoActivate avoids deactivating the currently active window.</em></pre>
<p>&nbsp;</p>
<pre class="NoIndent"><em>; 示例: A simple input-box that asks for first name and last name:</em>

Gui, Add, Text,, First name: Gui, Add, Text,, Last name: Gui, Add, Edit, vFirstName ym <em>; The ym option starts a new column of controls.</em>
Gui, Add, Edit, vLastName Gui, Add, Button, default, OK <em>; The label ButtonOK (if it exists) will be run when the button is pressed.</em>
Gui, Show,, Simple Input Example return <em>; End of auto-execute section. The script is idle until the user does something.</em>

GuiClose: ButtonOK: Gui, Submit <em>; Save the input from the user to each control's associated variable.</em>
MsgBox You entered "%FirstName% %LastName%". ExitApp</pre>
<p>&nbsp;</p>
<pre class="NoIndent"><em>; 示例: Tab control:</em>

Gui, Add, Tab2,, First Tab|Second Tab|Third Tab <em>; Tab2 vs. Tab requires v1.0.47.05.</em>
Gui, Add, Checkbox, vMyCheckbox, Sample checkbox Gui, Tab, 2 Gui, Add, Radio, vMyRadio, Sample radio1 Gui, Add, Radio,, Sample radio2 Gui, Tab, 3 Gui, Add, Edit, vMyEdit r5 <em>; r5 means 5 rows tall.</em>
Gui, Tab <em>; i.e. subsequently-added controls will not belong to the tab control.</em>
Gui, Add, Button, default xm, OK <em>; xm puts it at the bottom left corner.</em>
Gui, Show return ButtonOK: GuiClose: GuiEscape: Gui, Submit <em>; Save each control's contents to its associated variable.</em>
MsgBox You entered:`n%MyCheckbox%`n%MyRadio%`n%MyEdit% ExitApp</pre>
<p>&nbsp;</p>
<pre class="NoIndent"><em>; 示例: ListBox containing files in a directory:</em>

Gui, Add, Text,, Pick a file to launch from the list below.`nTo cancel, press ESCAPE or close this window. Gui, Add, ListBox, vMyListBox gMyListBox w640 r10 Gui, Add, Button, Default, OK Loop, C:\*.* <em>; Change this folder and wildcard pattern to suit your preferences.</em>
{ GuiControl,, MyListBox, %A_LoopFileFullPath% } Gui, Show return MyListBox: if A_GuiEvent &lt;&gt; DoubleClick return
<em>; Otherwise, the user double-clicked a list item, so treat that the same as pressing OK. ; So fall through to the next label.</em>
ButtonOK: GuiControlGet, MyListBox <em>; Retrieve the ListBox's current selection.</em>
MsgBox, 4,, Would you you like to launch the file or document below?`n`n%MyListBox% IfMsgBox, No return
<em>; Otherwise, try to launch it:</em>
Run, %MyListBox%,, UseErrorLevel if ErrorLevel = ERROR MsgBox Could not launch the specified file. Perhaps it is not associated with anything. return GuiClose: GuiEscape: ExitApp</pre>
<p>&nbsp;</p>
<pre class="NoIndent"><a name="ExToolTip"></a><em>; 示例: Display context-senstive help (via ToolTip) whenever the user moves the mouse over a particular control:</em>

Gui, Add, Edit, v<strong>MyEdit</strong>
<strong>MyEdit</strong>_TT := "This is a tooltip for the control whose variable is MyEdit." Gui, Add, DropDownList, v<strong>MyDDL</strong>, Red|Green|Blue
<strong>MyDDL</strong>_TT := "Choose a color from the drop-down list." Gui, Add, Checkbox, vMyCheck, This control has no tooltip. Gui, Show
<a href="OnMessage.htm">OnMessage</a>(0x200, "WM_MOUSEMOVE") return WM_MOUSEMOVE() { static CurrControl, PrevControl, _TT <em>; _TT is kept blank for use by the ToolTip command below.</em>
 CurrControl := A_GuiControl If (CurrControl &lt;&gt; PrevControl and not InStr(CurrControl, " ")) { ToolTip <em>; Turn off any previous tooltip.</em>
 SetTimer, DisplayToolTip, 1000 PrevControl := CurrControl } return DisplayToolTip: SetTimer, DisplayToolTip, Off <a href="ToolTip.htm">ToolTip</a> % %CurrControl%_TT <em>; The leading percent sign tell it to use an expression.</em>
 SetTimer, RemoveToolTip, 3000 return RemoveToolTip: SetTimer, RemoveToolTip, Off ToolTip return } GuiClose: ExitApp</pre>
<p>&nbsp;</p>
<pre class="NoIndent"><a name="OSD"></a><em>; 示例: On-screen display (OSD) via transparent window:</em>

CustomColor = EEAA99 <em>; Can be any RGB color (it will be made transparent below).</em>
Gui +LastFound +AlwaysOnTop -Caption +ToolWindow <em>; +ToolWindow avoids a taskbar button and an alt-tab menu item.</em>
Gui, Color, %CustomColor% Gui, Font, s32 <em>; Set a large font size (32-point).</em>
Gui, Add, Text, vMyText cLime, XXXXX YYYYY <em>; XX &amp; YY serve to auto-size the window. ; Make all pixels of this color transparent and make the text itself translucent (150):</em>
WinSet, TransColor, %CustomColor% 150 SetTimer, UpdateOSD, 200 Gosub, UpdateOSD <em>; Make the first update immediate rather than waiting for the timer.</em>
Gui, Show, x0 y400 NoActivate <em>; NoActivate avoids deactivating the currently active window.</em>
return UpdateOSD: MouseGetPos, MouseX, MouseY GuiControl,, MyText, X%MouseX%, Y%MouseY% return</pre>
<p>&nbsp;</p>
<pre class="NoIndent"><em>; 示例: A moving progress bar overlayed on a background image.</em>

Gui, Color, White Gui, Add, Picture, x0 y0 h350 w450, %A_WinDir%\system32\ntimage.gif Gui, Add, Button, Default xp+20 yp+250, Start the Bar Moving Gui, Add, Progress, vMyProgress w416 Gui, Add, Text, vMyText wp <em>; wp means "use width of previous".</em>
Gui, Show return ButtonStartTheBarMoving: Loop, %A_WinDir%\*.* { if A_Index &gt; 100 break GuiControl,, MyProgress, %A_Index% GuiControl,, MyText, %A_LoopFileName% Sleep 50 } GuiControl,, MyText, Bar finished. return GuiClose: ExitApp</pre>
<p>&nbsp;</p>
<pre class="NoIndent"><em>; 示例: Simple image viewer:</em>

Gui, +Resize Gui, Add, Button, default, &amp;Load New Image Gui, Add, Radio, ym+5 x+10 vRadio checked, Load &amp;actual size Gui, Add, Radio, ym+5 x+10, Load to &amp;fit screen Gui, Add, Pic, xm vPic Gui, Show return ButtonLoadNewImage: FileSelectFile, file,,, Select an image:, Images (*.gif; *.jpg; *.bmp; *.png; *.tif; *.ico; *.cur; *.ani; *.exe; *.dll) if file = return Gui, Submit, NoHide <em>; Save the values of the radio buttons.</em>
if Radio = 1 <em>; Display image at its actual size.</em>
{ Width = 0 Height = 0 } else <em>; Second radio is selected: Resize the image to fit the screen.</em>
{ Width := A_ScreenWidth - 28 <em>; Minus 28 to allow room for borders and margins inside.</em>
 Height = -1 <em>; "Keep aspect ratio" seems best.</em>
} GuiControl,, Pic, *w%width% *h%height% %file% <em>; Load the image.</em>
Gui, Show, xCenter y0 AutoSize, %file% <em>; Resize the window to match the picture size.</em>
return GuiClose: ExitApp</pre>
<p>&nbsp;</p>
<pre class="NoIndent"><em>; 示例: Simple text editor with menu bar.</em>

<em>; Create the sub-menus for the menu bar:</em>
Menu, FileMenu, Add, &amp;New, FileNew Menu, FileMenu, Add, &amp;Open, FileOpen Menu, FileMenu, Add, &amp;Save, FileSave Menu, FileMenu, Add, Save &amp;As, FileSaveAs Menu, FileMenu, Add <em>; Separator line.</em>
Menu, FileMenu, Add, E&amp;xit, FileExit Menu, HelpMenu, Add, &amp;About, HelpAbout

<em>; Create the menu bar by attaching the sub-menus to it:</em>
Menu, MyMenuBar, Add, &amp;File, :FileMenu Menu, MyMenuBar, Add, &amp;Help, :HelpMenu

<em>; Attach the menu bar to the window:</em>
Gui, Menu, MyMenuBar

<em>; Create the main Edit control and display the window:</em>
Gui, +Resize <em>; Make the window resizable.</em>
Gui, Add, Edit, vMainEdit WantTab W600 R20 Gui, Show,, Untitled CurrentFileName = <em>; Indicate that there is no current file.</em>
return FileNew: GuiControl,, MainEdit <em>; Clear the Edit control.</em>
return FileOpen: Gui +OwnDialogs <em>; Force the user to dismiss the FileSelectFile dialog before returning to the main window.</em>
FileSelectFile, SelectedFileName, 3,, Open File, Text Documents (*.txt) if SelectedFileName = <em>; No file selected.</em>
 return Gosub FileRead return FileRead: <em>; Caller has set the variable SelectedFileName for us.</em>
FileRead, MainEdit, %SelectedFileName% <em>; Read the file's contents into the variable.</em>
if ErrorLevel { MsgBox Could not open "%SelectedFileName%". return } GuiControl,, MainEdit, %MainEdit% <em>; Put the text into the control.</em>
CurrentFileName = %SelectedFileName% Gui, Show,, %CurrentFileName% <em>; Show file name in title bar.</em>
return FileSave: if CurrentFileName = <em>; No filename selected yet, so do Save-As instead.</em>
 Goto FileSaveAs Gosub SaveCurrentFile return FileSaveAs: Gui +OwnDialogs <em>; Force the user to dismiss the FileSelectFile dialog before returning to the main window.</em>
FileSelectFile, SelectedFileName, S16,, Save File, Text Documents (*.txt) if SelectedFileName = <em>; No file selected.</em>
 return CurrentFileName = %SelectedFileName% Gosub SaveCurrentFile return SaveCurrentFile: <em>; Caller has ensured that CurrentFileName is not blank.</em>
IfExist %CurrentFileName% { FileDelete %CurrentFileName% if ErrorLevel { MsgBox The attempt to overwrite "%CurrentFileName%" failed. return } } GuiControlGet, MainEdit <em>; Retrieve the contents of the Edit control.</em>
FileAppend, %MainEdit%, %CurrentFileName% <em>; Save the contents to the file. ; Upon success, Show file name in title bar (in case we were called by FileSaveAs):</em>
Gui, Show,, %CurrentFileName% return HelpAbout: Gui, 2:+owner1 <em>; Make the main window (Gui #1) the owner of the "about box" (Gui #2).</em>
Gui +Disabled <em>; Disable main window.</em>
Gui, 2:Add, Text,, Text for about box. Gui, 2:Add, Button, Default, OK Gui, 2:Show return 2ButtonOK: <em>; This section is used by the "about box" above.</em>
2GuiClose: 2GuiEscape: Gui, 1:-Disabled <em>; Re-enable the main window (must be done prior to the next step).</em>
Gui Destroy <em>; Destroy the about box.</em>
return GuiDropFiles: <em>; Support drag &amp; drop.</em>
Loop, parse, A_GuiEvent, `n { SelectedFileName = %A_LoopField% <em>; Get the first file only (in case there's more than one).</em>
 break } Gosub FileRead return GuiSize: if ErrorLevel = 1 <em>; The window has been minimized. No action needed.</em>
 return
<em>; Otherwise, the window has been resized or maximized. Resize the Edit control to match.</em>
NewWidth := A_GuiWidth - 20 NewHeight := A_GuiHeight - 20 GuiControl, Move, MainEdit, W%NewWidth% H%NewHeight% return FileExit: <em>; User chose "Exit" from the File menu.</em>
GuiClose: <em>; User closed the window.</em>
ExitApp</pre>
</body>
</html>
